package com.exer2;

import com.exer1.Component;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfo;
import io.github.classgraph.ClassInfoList;
import io.github.classgraph.ScanResult;

import java.util.Map;

/**
 * @ClassName Scan
 * @Description TODO
 * @Author Kx
 * @Date 2025/4/16 19:53
 * @Version 1.0
 */
public class Scan {
    /***
     * @author: kx
     * @date: 2025/4/16 20:10
     * @return io.github.classgraph.ClassInfoList : 扫描到的类集合
     * @description: 利用第三方库扫描项目下带有@Pay注解的类
    */
    private static ClassInfoList scan() {
        // 创建ClassGraph对象
        ClassGraph graph = new ClassGraph();

        // 扫描当前项目下的所有类,并返回结果集
        ScanResult result = graph.acceptPackages("com.exer2").scan();

        return result.getAllClasses();
    }

    /***
     * @author: kx
     * @date: 2025/4/16 20:14
     * @param map : 存储支付方式的容器
     * @description: 扫描整个项目下带有@Pay注解的类并存储到容器中
    */
    public static void init(Map<String,Object> map) {
        // 获取所有类集合
        ClassInfoList classList = scan();

        // 遍历所有类集合
        for (ClassInfo classInfo : classList) {

            // 通过类加载器获取类对象
            Class<?> clazz = classInfo.loadClass();

            // 判断是否带有@Pay注解
            if (clazz.isAnnotationPresent(Pay.class)) {
                // 将带有注解的类存放到容器中
                try {
                    // 获取注解的值
                    String value = clazz.getAnnotation(Pay.class).value();
                    // 获取当前类
                    Object object = clazz.getConstructor().newInstance();

                    // 存放到容器中
                    map.put(value,object);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
